﻿using Quaack.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Quaack.Web
{
    public partial class Inschrijven : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (Page.User.Identity.IsAuthenticated)
            {
                Context.Response.StatusCode = 403;
                lblIngelogd.Visible = true;
                panelFormulier.Visible = false;
            }
        }

        /// <summary>
        /// Controleert of de gekozen gebruikersnaam nog vrij is
        /// </summary>
        /// <param name="source"></param>
        /// <param name="args"></param>
        protected void Gebruikersnaam_Validate(object source, ServerValidateEventArgs args)
        {
            MembershipUserCollection users = Membership.FindUsersByName(args.Value);
            args.IsValid = users.Count == 0;
        }

        /// <summary>
        /// Controleert of het opgegeven wachtwoord gelijk is aan het wachtwoord-veld
        /// </summary>
        /// <param name="source"></param>
        /// <param name="args"></param>
        protected void WachtwoordenGelijk_Validate(object source, ServerValidateEventArgs args)
        {
            args.IsValid = txtWachtwoord.Text == args.Value;
        }

        protected void btnInschrijven_Click(object sender, EventArgs e)
        {
            if (!Page.IsValid || Page.User.Identity.IsAuthenticated)
            {
                return;
            }

            // Gebruiker toevoegen aan ASP.NET Membership
            MembershipUser user = Membership.CreateUser(txtGebruikersnaam.Text, txtWachtwoord.Text);
            if (!Roles.RoleExists("gebruiker"))
            {
                Roles.CreateRole("gebruiker");
            }
            Roles.AddUserToRole(txtGebruikersnaam.Text, "gebruiker");
            if (!Roles.RoleExists("admin"))
            {
                // Dit is de eerste gebruiker die wordt aangemaakt, admin rol toekennen
                Roles.CreateRole("admin");
                Roles.AddUserToRole(txtGebruikersnaam.Text, "admin");
            }
            // Gebruiker toevoegen aan Quaack
            Profiel profiel = new Profiel(txtGebruikersnaam.Text, txtProfielschets.Text, txtEmail.Text, txtMobiel.Text, Page.ResolveUrl("~/Avatars/default.png"));
            // Avatar uploaden (indien geset, dit kan pas na het aanmaken van het profiel omdat we het Id nodig hebben)
            if (FileAvatar.HasFile)
            {
                string extension = FileAvatar.FileName.Substring(FileAvatar.FileName.Length - 4);
                FileAvatar.SaveAs(String.Format(@"{0}\Avatars\{1}.{2}", Request.PhysicalApplicationPath, profiel.Id, extension));
                profiel.AvatarLocatie = Page.ResolveUrl(String.Format("~/Avatars/{0}.{1}", profiel.Id, extension));
            }
            // Verificatie-url opbouwen, vrij naar http://stackoverflow.com/questions/3681052 -- 29/06/2013
            Uri currentUrl = HttpContext.Current.Request.Url;
            string port = currentUrl.Port == 80 ? "" : ":" + currentUrl.Port;
            string url = string.Format("{0}://{1}{2}{3}?profiel={4}&code={5}", currentUrl.Scheme, currentUrl.Host, port, Page.ResolveUrl("~/Verifieer.aspx"), profiel.Id, profiel.VerificatieCode);
            // Mail sturen naar gebruiker
            Provider.SendMail(profiel.Emailadres, "Bevestig profiel",
                string.Format(
                    @"<p>Beste {0}</p>
                      <p>Je profiel op Quaack is aangemaakt maar moet nog bevestigd worden. Dit gebeurd door op onderstaande link te klikken. <br/>
                      <a href='{1}'>{1}</a></p>
                      <p>Met vriendelijke groet,</p>
                      <p>Quaack</p>", profiel.Gebruikersnaam, url));
            
            // Melding op scherm
            panelFormulier.Visible = false;
            lblVoltooid.Visible = true;
        }
    }
}